/* 防抖:触发高频事件后n秒内函数只会执行一次，
如果n秒内高频事件再次被触发，则重新计算时间
使用场景：频繁触发、输入框搜索、表单提交
即：规定时间内只触发一次
*/
export const debounce = (fn: Function, t: any) => {
    const delay = t || 500
    let timer: any
    return function () {
        const args = arguments
        if (timer) {
            clearTimeout(timer)
        }
        timer = setTimeout(() => {
            timer = null
            fn.apply(this, args)
        }, delay)
    }
}

/* 节流：高频事件触发，但在n秒内只会执行一次，
所以节流会稀释函数的执行频率
使用场景：频繁触发、onrize，onscroll滚动条、
onresize 事件会在窗口或框架被调整大小时发生
onscroll 滚动条发生时有效
即：规定事件内只执行一次，其余发在规定事件后执行
*/
export const Throttle = (fn: Function, t: any) => {
    let last: any
    let timer: any
    const interval = t || 500
    return function () {
        const args = arguments
        const now = +new Date()
        if (last && now - last < interval) {
            clearTimeout(timer)
            timer = setTimeout(() => {
                last = now
                fn.apply(this, args)
            }, interval)
        } else {
            last = now
            fn.apply(this, args)
        }
    }
}
